package vista.geometria;

import java.awt.Point;
import java.lang.Math;
import java.nio.FloatBuffer;

import javax.media.opengl.GL2;


public class Elipse {

	private int alturaRenglon;
	private int cantidadPuntos;
	
	private double b;
	private double a;
	
	private double anguloMinimo;
	
	public Elipse (int altura, int cantidad) {
		this.alturaRenglon = altura;
		this.cantidadPuntos = cantidad;
		
		this.anguloMinimo = 2*Math.PI/this.cantidadPuntos;
		
		int cantidadRenglones = (int) Math.max(Math.ceil((this.cantidadPuntos - 4.0)/4),1);
		
		b = (this.alturaRenglon/2.0 + this.alturaRenglon*cantidadRenglones);
		a = 1.5*b;
	}
	
	public double getA () {
		return this.a;
	}
	
	public double getB () {
		return this.b;
	}
	
	public Point getPunto(Point center, int n) 
	{
		double angulo = this.getAngulo(n);
		
		Point punto = new Point( (int) (center.x + this.a * Math.cos(angulo)),
				(int) (center.y + this.b * Math.sin(angulo)));
		
		return punto;
	}
	
	private double getAngulo(int n) {
		return n * this.anguloMinimo - Math.PI/2;
	}
	
	public static void dibujarElipseRelleno(GL2 gl, float ejeX, float ejeY, float cantDiv, FloatBuffer colorRelleno )
	{
		double incremento = 2 * Math.PI/ cantDiv;
		
		gl.glColor3fv(colorRelleno);
		gl.glBegin(GL2.GL_TRIANGLE_FAN);
		
			gl.glVertex2f(0.0f, 0.0f);
			
			for (double angulo = 0; angulo <= 2 * Math.PI; angulo+=incremento) 
				gl.glVertex2d(Math.cos(angulo) * ejeX, Math.sin(angulo) * ejeY);
				
		gl.glEnd();
	}
	
	public static void dibujarElipseContorno(GL2 gl, float ejeX, float ejeY, float cantDiv)
	{
		double incremento = 2 * Math.PI/ cantDiv;
		
		gl.glBegin(GL2.GL_LINE_LOOP);
			for (double angulo = 0; angulo < 2 * Math.PI; angulo+=incremento) 
				gl.glVertex2d(Math.cos(angulo) * ejeX, Math.sin(angulo) * ejeY);
				
		gl.glEnd();
	}
	
}
